/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * form.java
 *
 * Created on 10-02-2011, 12:52:38 AM
 */
package aplicacion;

import acercade.AcercaDe;
import acercade.GPL;
import clases.*;
import java.awt.Point;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JLabel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import utilidades.Cambiar;
import utilidades.Mensajes;

/**
 *
 * @author pato
 */
public class Aplicacion extends javax.swing.JFrame{

    private Mazo mazo;
    private int lblx, lbly;
    private int x, y, xref, yref;
    private int indice;
    private int c = 1;
    private List<Carta> lesp1 = new ArrayList<>();
    private List<Carta> lesp2 = new ArrayList<>();
    private List<Carta> lesp3 = new ArrayList<>();
    private List<Carta> lesp4 = new ArrayList<>();
    private List<Carta> lesp5 = new ArrayList<>();
    private List<Carta> lesp6 = new ArrayList<>();
    private List<Carta> lesp7 = new ArrayList<>();
    private List<Carta> lesp8 = new ArrayList<>();

    /** Creates new form form */
    public Aplicacion() {
        initComponents();
        Imagen.CARTA_VUELTA = Imagen.CARTA_ROJA;
        setLocationRelativeTo(null);
        setResizable(false);
        setTitle("JSolitario");
        inicializarMazo(false);
        Cambiar.iconoDeFormulario(this, "/imagenes/icono.png");
        initAcercaDe();
        
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        formBar = new javax.swing.JFrame();
        esp9 = new javax.swing.JLabel();
        esp10 = new javax.swing.JLabel();
        esp11 = new javax.swing.JLabel();
        esp12 = new javax.swing.JLabel();
        esp13 = new javax.swing.JLabel();
        carta1 = new javax.swing.JLabel();
        carta2 = new javax.swing.JLabel();
        cartaVuelta = new javax.swing.JLabel();
        esp2 = new javax.swing.JLabel();
        esp3 = new javax.swing.JLabel();
        esp4 = new javax.swing.JLabel();
        esp5 = new javax.swing.JLabel();
        esp6 = new javax.swing.JLabel();
        esp7 = new javax.swing.JLabel();
        esp8 = new javax.swing.JLabel();
        esp1 = new javax.swing.JLabel();
        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        cartasRestantes = new javax.swing.JLabel();
        fondo = new javax.swing.JLabel();
        jMenuBar1 = new javax.swing.JMenuBar();
        jMenu1 = new javax.swing.JMenu();
        jMenuItem1 = new javax.swing.JMenuItem();
        jSeparator1 = new javax.swing.JPopupMenu.Separator();
        jMenuItem2 = new javax.swing.JMenuItem();
        jMenuItem4 = new javax.swing.JMenuItem();
        jMenuItem5 = new javax.swing.JMenuItem();
        jMenuItem3 = new javax.swing.JMenuItem();
        jMenu2 = new javax.swing.JMenu();
        verCartaAbajo = new javax.swing.JCheckBoxMenuItem();
        jMenu3 = new javax.swing.JMenu();
        menuItemAcercade = new javax.swing.JMenuItem();

        esp9.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        esp9.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/gilda.png"))); // NOI18N
        esp9.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(0, 0, 0), 1, true));
        esp9.setOpaque(true);
        esp9.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseReleased(java.awt.event.MouseEvent evt) {
                esp9MouseReleased(evt);
            }
        });

        esp10.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        esp10.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/pato.png"))); // NOI18N
        esp10.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(0, 0, 0), 1, true));
        esp10.setOpaque(true);
        esp10.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseReleased(java.awt.event.MouseEvent evt) {
                esp10MouseReleased(evt);
            }
        });

        esp11.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        esp11.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/fabi.png"))); // NOI18N
        esp11.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(0, 0, 0), 1, true));
        esp11.setOpaque(true);
        esp11.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseReleased(java.awt.event.MouseEvent evt) {
                esp11MouseReleased(evt);
            }
        });

        esp12.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        esp12.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/angeles.png"))); // NOI18N
        esp12.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(0, 0, 0), 1, true));
        esp12.setOpaque(true);
        esp12.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseReleased(java.awt.event.MouseEvent evt) {
                esp12MouseReleased(evt);
            }
        });

        esp13.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        esp13.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/aru.png"))); // NOI18N
        esp13.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(0, 0, 0), 1, true));
        esp13.setOpaque(true);
        esp13.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseReleased(java.awt.event.MouseEvent evt) {
                esp13MouseReleased(evt);
            }
        });

        javax.swing.GroupLayout formBarLayout = new javax.swing.GroupLayout(formBar.getContentPane());
        formBar.getContentPane().setLayout(formBarLayout);
        formBarLayout.setHorizontalGroup(
            formBarLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(formBarLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(esp10, javax.swing.GroupLayout.PREFERRED_SIZE, 110, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(esp9, javax.swing.GroupLayout.PREFERRED_SIZE, 110, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(esp11, javax.swing.GroupLayout.PREFERRED_SIZE, 110, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(esp12, javax.swing.GroupLayout.PREFERRED_SIZE, 110, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(esp13, javax.swing.GroupLayout.PREFERRED_SIZE, 110, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        formBarLayout.setVerticalGroup(
            formBarLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(formBarLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(formBarLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(esp13)
                    .addComponent(esp12)
                    .addComponent(esp11)
                    .addComponent(esp9)
                    .addComponent(esp10))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        getContentPane().setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());

        carta1.setBackground(new java.awt.Color(254, 254, 254));
        carta1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        carta1.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(0, 0, 0), 1, true));
        carta1.setOpaque(true);
        carta1.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                carta1MouseClicked(evt);
            }
            public void mousePressed(java.awt.event.MouseEvent evt) {
                carta1MousePressed(evt);
            }
            public void mouseReleased(java.awt.event.MouseEvent evt) {
                carta1MouseReleased(evt);
            }
        });
        carta1.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
            public void mouseDragged(java.awt.event.MouseEvent evt) {
                carta1MouseDragged(evt);
            }
        });
        getContentPane().add(carta1, new org.netbeans.lib.awtextra.AbsoluteConstraints(260, 410, 120, 170));

        carta2.setBackground(new java.awt.Color(254, 254, 254));
        carta2.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        carta2.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(0, 0, 0), 1, true));
        getContentPane().add(carta2, new org.netbeans.lib.awtextra.AbsoluteConstraints(240, 410, 120, 170));

        cartaVuelta.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        cartaVuelta.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/rojo.png"))); // NOI18N
        cartaVuelta.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(0, 0, 0), 1, true));
        cartaVuelta.setOpaque(true);
        cartaVuelta.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mousePressed(java.awt.event.MouseEvent evt) {
                cartaVueltaMousePressed(evt);
            }
            public void mouseReleased(java.awt.event.MouseEvent evt) {
                cartaVueltaMouseReleased(evt);
            }
        });
        getContentPane().add(cartaVuelta, new org.netbeans.lib.awtextra.AbsoluteConstraints(400, 410, -1, 170));

        esp2.setBackground(new java.awt.Color(2, 102, 25));
        esp2.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        esp2.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/fondosCartas/fondo_esp2.png"))); // NOI18N
        esp2.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(0, 0, 0), 1, true));
        esp2.setOpaque(true);
        getContentPane().add(esp2, new org.netbeans.lib.awtextra.AbsoluteConstraints(260, 20, 120, 170));

        esp3.setBackground(new java.awt.Color(2, 102, 25));
        esp3.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        esp3.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/fondosCartas/fondo_esp3.png"))); // NOI18N
        esp3.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(0, 0, 0), 1, true));
        esp3.setOpaque(true);
        getContentPane().add(esp3, new org.netbeans.lib.awtextra.AbsoluteConstraints(400, 20, 120, 170));

        esp4.setBackground(new java.awt.Color(2, 102, 25));
        esp4.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        esp4.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/fondosCartas/fondo_esp4.png"))); // NOI18N
        esp4.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(0, 0, 0), 1, true));
        esp4.setOpaque(true);
        getContentPane().add(esp4, new org.netbeans.lib.awtextra.AbsoluteConstraints(540, 20, 120, 170));

        esp5.setBackground(new java.awt.Color(2, 102, 25));
        esp5.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        esp5.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/fondosCartas/fondo_esp5.png"))); // NOI18N
        esp5.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(0, 0, 0), 1, true));
        esp5.setOpaque(true);
        getContentPane().add(esp5, new org.netbeans.lib.awtextra.AbsoluteConstraints(120, 200, 120, 170));

        esp6.setBackground(new java.awt.Color(2, 102, 25));
        esp6.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        esp6.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/fondosCartas/fondo_esp6.png"))); // NOI18N
        esp6.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(0, 0, 0), 1, true));
        esp6.setOpaque(true);
        getContentPane().add(esp6, new org.netbeans.lib.awtextra.AbsoluteConstraints(260, 200, 120, 170));

        esp7.setBackground(new java.awt.Color(2, 102, 25));
        esp7.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        esp7.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/fondosCartas/fondo_esp7.png"))); // NOI18N
        esp7.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(0, 0, 0), 1, true));
        esp7.setOpaque(true);
        getContentPane().add(esp7, new org.netbeans.lib.awtextra.AbsoluteConstraints(400, 200, 120, 170));

        esp8.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        esp8.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/fondosCartas/fondo_esp8.png"))); // NOI18N
        esp8.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(0, 0, 0), 1, true));
        getContentPane().add(esp8, new org.netbeans.lib.awtextra.AbsoluteConstraints(540, 200, 120, 170));

        esp1.setBackground(new java.awt.Color(2, 102, 25));
        esp1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        esp1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/fondosCartas/fondo_esp1.png"))); // NOI18N
        esp1.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(0, 0, 0), 1, true));
        esp1.setOpaque(true);
        getContentPane().add(esp1, new org.netbeans.lib.awtextra.AbsoluteConstraints(120, 20, 120, 170));

        jLabel1.setFont(new java.awt.Font("DejaVu Sans", 1, 13)); // NOI18N
        jLabel1.setForeground(new java.awt.Color(254, 254, 254));
        jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
        jLabel1.setText("Cartas en el mazo: ");
        getContentPane().add(jLabel1, new org.netbeans.lib.awtextra.AbsoluteConstraints(10, 560, 150, 30));

        jLabel2.setFont(new java.awt.Font("DejaVu Sans", 1, 13)); // NOI18N
        jLabel2.setForeground(new java.awt.Color(254, 254, 254));
        jLabel2.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        getContentPane().add(jLabel2, new org.netbeans.lib.awtextra.AbsoluteConstraints(540, 560, 250, 30));

        cartasRestantes.setFont(new java.awt.Font("DejaVu Sans", 1, 13)); // NOI18N
        cartasRestantes.setForeground(new java.awt.Color(254, 254, 254));
        cartasRestantes.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
        cartasRestantes.setText("xx");
        getContentPane().add(cartasRestantes, new org.netbeans.lib.awtextra.AbsoluteConstraints(140, 560, 50, 30));

        fondo.setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/fondo.png"))); // NOI18N
        getContentPane().add(fondo, new org.netbeans.lib.awtextra.AbsoluteConstraints(0, 0, 800, 600));

        jMenu1.setText("Juego");

        jMenuItem1.setText("Barajar Cartas");
        jMenuItem1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem1ActionPerformed(evt);
            }
        });
        jMenu1.add(jMenuItem1);
        jMenu1.add(jSeparator1);

        jMenuItem2.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_Z, java.awt.event.InputEvent.CTRL_MASK));
        jMenuItem2.setText("Deshacer Jugada");
        jMenuItem2.setEnabled(false);
        jMenuItem2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem2ActionPerformed(evt);
            }
        });
        jMenu1.add(jMenuItem2);

        jMenuItem4.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_V, 0));
        jMenuItem4.setText("Voltear carta");
        jMenuItem4.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem4ActionPerformed(evt);
            }
        });
        jMenu1.add(jMenuItem4);

        jMenuItem5.setText("Cambiar baraja");
        jMenuItem5.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem5ActionPerformed(evt);
            }
        });
        jMenu1.add(jMenuItem5);

        jMenuItem3.setText("Salir");
        jMenuItem3.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jMenuItem3ActionPerformed(evt);
            }
        });
        jMenu1.add(jMenuItem3);

        jMenuBar1.add(jMenu1);

        jMenu2.setText("Ver");

        verCartaAbajo.setSelected(true);
        verCartaAbajo.setText("Carta de Abajo");
        verCartaAbajo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                verCartaAbajoActionPerformed(evt);
            }
        });
        jMenu2.add(verCartaAbajo);

        jMenuBar1.add(jMenu2);

        jMenu3.setText("Ayuda");

        menuItemAcercade.setText("Acerca de...");
        jMenu3.add(menuItemAcercade);

        jMenuBar1.add(jMenu3);

        setJMenuBar(jMenuBar1);

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void cartaVueltaMousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_cartaVueltaMousePressed
        
}//GEN-LAST:event_cartaVueltaMousePressed

    private void carta1MousePressed(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_carta1MousePressed
        xref = evt.getX();
        yref = evt.getY();
    }//GEN-LAST:event_carta1MousePressed

    private void carta1MouseDragged(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_carta1MouseDragged
        carta2.setVisible(true);
        lblx = this.carta1.getX();
        lbly = this.carta1.getY();

        x = evt.getX();
        y = evt.getY();

        if (indice != mazo.getMazo().size()) {
            carta1.setBounds(lblx - (xref - x), lbly - (yref - y), 120, 170);
        }
    }//GEN-LAST:event_carta1MouseDragged

    private void carta1MouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_carta1MouseReleased
        if(evt.getClickCount() != 2){
            if (queCuadranteEstoy(getMousePosition()) != Cuadrante.ESPACIO_INVALIDO) {
                switch( queCuadranteEstoy(getMousePosition()) ){
                    case (Cuadrante.ESPACIO1):{
                        jugarCarta(OrdenDeJugada.DESCENDIENTE, lesp1, esp1);
                        break;
                    }
                    case (Cuadrante.ESPACIO2):{
                        jugarCarta(OrdenDeJugada.DESCENDIENTE, lesp2, esp2);
                        break;
                    }
                    case (Cuadrante.ESPACIO3):{
                        jugarCarta(OrdenDeJugada.DESCENDIENTE, lesp3, esp3);
                        break;
                    }
                    case (Cuadrante.ESPACIO4):{
                        jugarCarta(OrdenDeJugada.DESCENDIENTE, lesp4, esp4);
                        break;
                    }
                    case (Cuadrante.ESPACIO5):{
                        jugarCarta(OrdenDeJugada.ASCENDENTE, lesp5, esp5);
                        break;
                    }
                    case (Cuadrante.ESPACIO6):{
                        jugarCarta(OrdenDeJugada.ASCENDENTE, lesp6, esp6);
                        break;
                    }
                    case (Cuadrante.ESPACIO7):{
                        jugarCarta(OrdenDeJugada.ASCENDENTE, lesp7, esp7);
                        break;
                    }
                    case (Cuadrante.ESPACIO8):{
                        jugarCarta(OrdenDeJugada.ASCENDENTE, lesp8, esp8);
                        break;
                    }
                }
            }
        }else{ //doble click
            int n = getEspacioJugable(mazo.getCarta(indice));
            System.out.println("Doble click: espacio jugable: "+n);
            if(n != -1){
                switch(n){
                    case (Cuadrante.ESPACIO1):{
                        jugarCarta(OrdenDeJugada.DESCENDIENTE, lesp1, esp1);
                        break;
                    }
                    case (Cuadrante.ESPACIO2):{
                        jugarCarta(OrdenDeJugada.DESCENDIENTE, lesp2, esp2);
                        break;
                    }
                    case (Cuadrante.ESPACIO3):{
                        jugarCarta(OrdenDeJugada.DESCENDIENTE, lesp3, esp3);
                        break;
                    }
                    case (Cuadrante.ESPACIO4):{
                        jugarCarta(OrdenDeJugada.DESCENDIENTE, lesp4, esp4);
                        break;
                    }
                    case (Cuadrante.ESPACIO5):{
                        jugarCarta(OrdenDeJugada.ASCENDENTE, lesp5, esp5);
                        break;
                    }
                    case (Cuadrante.ESPACIO6):{
                        jugarCarta(OrdenDeJugada.ASCENDENTE, lesp6, esp6);
                        break;
                    }
                    case (Cuadrante.ESPACIO7):{
                        jugarCarta(OrdenDeJugada.ASCENDENTE, lesp7, esp7);
                        break;
                    }
                    case (Cuadrante.ESPACIO8):{
                        jugarCarta(OrdenDeJugada.ASCENDENTE, lesp8, esp8);
                        break;
                    }
                }
            }
        }
        
        if (mazo.getMazo().isEmpty()) {
            if (Mensajes.mensajePreguntaSiNo(this, "¡Has Ganado! ¿Deseas Jugar Nuevamente?") == Mensajes.SI) {
                juegoNuevo();
            }
        }
        reubicarCarta();
    }//GEN-LAST:event_carta1MouseReleased

    private void jMenuItem1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem1ActionPerformed
        if (Mensajes.mensajePreguntaSiNo(this, "¿Juego Nuevo?") == Mensajes.SI) {
            juegoNuevo();
        }
    }//GEN-LAST:event_jMenuItem1ActionPerformed

    private void jMenuItem2ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem2ActionPerformed
        indice += 2;
        cartas(indice);
    }//GEN-LAST:event_jMenuItem2ActionPerformed

    private void jMenuItem3ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem3ActionPerformed
        System.exit(0);
    }//GEN-LAST:event_jMenuItem3ActionPerformed

    private void verCartaAbajoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_verCartaAbajoActionPerformed
        if (!verCartaAbajo.isSelected()) {
            carta2.setBounds(260, 410, 120, 170);
        } else {
            carta2.setBounds(240, 410, 120, 170);
        }
    }//GEN-LAST:event_verCartaAbajoActionPerformed

    private void carta1MouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_carta1MouseClicked
//        carta2.setBounds(260, 410, 120, 170);
    }//GEN-LAST:event_carta1MouseClicked

private void jMenuItem4ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem4ActionPerformed
    cartaVueltaMouseReleased(null);
}//GEN-LAST:event_jMenuItem4ActionPerformed

    private void cartaVueltaMouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_cartaVueltaMouseReleased
        reubicarCarta();
        indice -= 2;
        cartas(indice);
    }//GEN-LAST:event_cartaVueltaMouseReleased

    private void jMenuItem5ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jMenuItem5ActionPerformed
        formBar.setBounds(0, 0, 610, 230);
        formBar.setLocationRelativeTo(null);
        formBar.setVisible(true);
    }//GEN-LAST:event_jMenuItem5ActionPerformed

    private void esp13MouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_esp13MouseReleased
        cabiarFondoCartaVuelta(Imagen.ARU);
    }//GEN-LAST:event_esp13MouseReleased

    private void esp12MouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_esp12MouseReleased
        cabiarFondoCartaVuelta(Imagen.ANGELES);
    }//GEN-LAST:event_esp12MouseReleased

    private void esp11MouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_esp11MouseReleased
        cabiarFondoCartaVuelta(Imagen.FABI);
    }//GEN-LAST:event_esp11MouseReleased

    private void esp10MouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_esp10MouseReleased
        cabiarFondoCartaVuelta(Imagen.PATO);
    }//GEN-LAST:event_esp10MouseReleased

    private void esp9MouseReleased(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_esp9MouseReleased
        cabiarFondoCartaVuelta(Imagen.GILDA);
    }//GEN-LAST:event_esp9MouseReleased

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(Aplicacion.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            Logger.getLogger(Aplicacion.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            Logger.getLogger(Aplicacion.class.getName()).log(Level.SEVERE, null, ex);
        } catch (UnsupportedLookAndFeelException ex) {
            Logger.getLogger(Aplicacion.class.getName()).log(Level.SEVERE, null, ex);
        }
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                new Aplicacion().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JLabel carta1;
    private javax.swing.JLabel carta2;
    private javax.swing.JLabel cartaVuelta;
    private javax.swing.JLabel cartasRestantes;
    private javax.swing.JLabel esp1;
    private javax.swing.JLabel esp10;
    private javax.swing.JLabel esp11;
    private javax.swing.JLabel esp12;
    private javax.swing.JLabel esp13;
    private javax.swing.JLabel esp2;
    private javax.swing.JLabel esp3;
    private javax.swing.JLabel esp4;
    private javax.swing.JLabel esp5;
    private javax.swing.JLabel esp6;
    private javax.swing.JLabel esp7;
    private javax.swing.JLabel esp8;
    private javax.swing.JLabel esp9;
    private javax.swing.JLabel fondo;
    private javax.swing.JFrame formBar;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JMenu jMenu1;
    private javax.swing.JMenu jMenu2;
    private javax.swing.JMenu jMenu3;
    private javax.swing.JMenuBar jMenuBar1;
    private javax.swing.JMenuItem jMenuItem1;
    private javax.swing.JMenuItem jMenuItem2;
    private javax.swing.JMenuItem jMenuItem3;
    private javax.swing.JMenuItem jMenuItem4;
    private javax.swing.JMenuItem jMenuItem5;
    private javax.swing.JPopupMenu.Separator jSeparator1;
    private javax.swing.JMenuItem menuItemAcercade;
    private javax.swing.JCheckBoxMenuItem verCartaAbajo;
    // End of variables declaration//GEN-END:variables

    private void cartas(int indice) {
        
        if (indice == 0) {//si estoy en la primera posicion
            Cambiar.fondoDeLabel(this, cartaVuelta, Imagen.VACIA);
        } else {
            Cambiar.fondoDeLabel(this, cartaVuelta, Imagen.CARTA_VUELTA);
        }

        if (indice < 0) {//tengo que saber que numero es, ya que me pase del limite de la lista
            if (indice == -1) {//si es -1 es que actualmente estoy mostrando el indice 1 y tengo que mostrar el indice 0
                this.indice = 0;
                cartas(this.indice);
            } else if (indice == -2) {//y si es -2 es que actualmente estoy mostrando el indice 0 y tengo dar vuelta las cartas
                this.indice = (mazo.getMazo().size()) - 2;
                cartas(this.indice);
            }
        } else {
            if (indice + 1 < mazo.getMazo().size()) {
                Cambiar.fondoDeLabel(this, carta2, Imagen.RAIZ + mazo.getCarta(indice + 1).getPinta() + "/" + mazo.getCarta(indice + 1).getNumero() + Imagen.EXTENSION);
            } else {
                Cambiar.fondoDeLabel(this, carta2, Imagen.VACIA);
            }

            if (indice == mazo.getMazo().size()) {
                Cambiar.fondoDeLabel(this, carta1, Imagen.VACIA);
            } else {
                Cambiar.fondoDeLabel(this, carta1, Imagen.RAIZ + mazo.getCarta(indice).getPinta() + "/" + mazo.getCarta(indice).getNumero() + Imagen.EXTENSION);
            }
        }
        cartasRestantes.setText(Integer.toString(mazo.getMazo().size()));
        jLabel2.setText(Integer.toString((indice == -2?mazo.getMazo().size()-2:indice)));
    }

    private int queCuadranteEstoy(Point p) {

        if (Pixel.puntoEstaDentro(p, esp1)) {
            return Cuadrante.ESPACIO1;
        } else if (Pixel.puntoEstaDentro(p, esp2)) {
            return Cuadrante.ESPACIO2;
        } else if (Pixel.puntoEstaDentro(p, esp3)) {
            return Cuadrante.ESPACIO3;
        } else if (Pixel.puntoEstaDentro(p, esp4)) {
            return Cuadrante.ESPACIO4;
        } else if (Pixel.puntoEstaDentro(p, esp5)) {
            return Cuadrante.ESPACIO5;
        } else if (Pixel.puntoEstaDentro(p, esp6)) {
            return Cuadrante.ESPACIO6;
        } else if (Pixel.puntoEstaDentro(p, esp7)) {
            return Cuadrante.ESPACIO7;
        } else if (Pixel.puntoEstaDentro(p, esp8)) {
            return Cuadrante.ESPACIO8;
        } else {
            return Cuadrante.ESPACIO_INVALIDO;
        }
    }

    private void reubicarCarta() {
        carta1.setBounds(260, 410, 120, 170);
    }

    private void jugarCarta(int ordenDeJugada, List<Carta> lista, javax.swing.JLabel lbl) {
//        if (queCuadranteEstoy(getMousePosition()).equalsIgnoreCase(nombreEspacio)) {
            if (lista.isEmpty()) {
                if (mazo.getCarta(indice).getNumero() == (ordenDeJugada == OrdenDeJugada.ASCENDENTE ? 1 : 13)) {
                    agregarCartaALista(lista, mazo.getCarta(indice),ordenDeJugada, lbl);
                    
//                    lista.add(mazo.getCarta(indice));
//                    mazo.getMazo().remove(indice);
//                    cartas(indice);
                } else {
                    reubicarCarta();
                }
            } else {//si el cuadrante no esta vacio
                Carta carta = (Carta) lista.get(lista.size() - 1);
                int numero = carta.getNumero();
                String pinta = carta.getPinta();

                if (mazo.getCarta(indice).getNumero() == (ordenDeJugada == OrdenDeJugada.ASCENDENTE ? numero + 1 : numero - 1) 
                        && mazo.getCarta(indice).getPinta().equalsIgnoreCase(pinta)) {
                    
                    agregarCartaALista(lista, mazo.getCarta(indice),ordenDeJugada, lbl);
                    
                }
                reubicarCarta();
            }
//        }
    
    }
    
    private boolean agregarCartaALista(List<Carta> lista, Carta c, int ordenDeJugada, JLabel lbl){
        //antes tengo que ver si no esta la pinta en otra lista
        
        if(ordenDeJugada == OrdenDeJugada.ASCENDENTE){//5,6,7,8
            if(lista == lesp5){// si es asi, tengo que ver que la pinta no este ni en 6, 7 y 8
                if(isPintaInLista(lesp6, c)){
                    return false;
                }
                if(isPintaInLista(lesp7, c)){
                    return false;
                }
                if(isPintaInLista(lesp8, c)){
                    return false;
                }
            }else if(lista == lesp6){
                if(isPintaInLista(lesp5, c)){
                    return false;
                }
                if(isPintaInLista(lesp7, c)){
                    return false;
                }
                if(isPintaInLista(lesp8, c)){
                    return false;
                }
            }else if(lista == lesp7){
                if(isPintaInLista(lesp5, c)){
                    return false;
                }
                if(isPintaInLista(lesp6, c)){
                    return false;
                }
                if(isPintaInLista(lesp8, c)){
                    return false;
                }
            }else{
                if(isPintaInLista(lesp5, c)){
                    return false;
                }
                if(isPintaInLista(lesp6, c)){
                    return false;
                }
                if(isPintaInLista(lesp7, c)){
                    return false;
                }
            }
        }else if(lista == lesp1){
            
                if(isPintaInLista(lesp2, c)){
                    return false;
                }
                if(isPintaInLista(lesp3, c)){
                    return false;
                }
                if(isPintaInLista(lesp4, c)){
                    return false;
                }
            }else if(lista == lesp2){
                if(isPintaInLista(lesp1, c)){
                    return false;
                }
                if(isPintaInLista(lesp3, c)){
                    return false;
                }
                if(isPintaInLista(lesp4, c)){
                    return false;
                }
            }else if(lista == lesp3){
                if(isPintaInLista(lesp1, c)){
                    return false;
                }
                if(isPintaInLista(lesp2, c)){
                    return false;
                }
                if(isPintaInLista(lesp4, c)){
                    return false;
                }
            }else{
                if(isPintaInLista(lesp1, c)){
                    return false;
                }
                if(isPintaInLista(lesp2, c)){
                    return false;
                }
                if(isPintaInLista(lesp3, c)){
                    return false;
                }
            }
        Cambiar.fondoDeLabel(this, lbl, Imagen.RAIZ + mazo.getCarta(indice).getPinta() + "/" + mazo.getCarta(indice).getNumero() + Imagen.EXTENSION);
//        Cambiar.fondoDeLabel(this, lbl, "/imagenes/" + mazo.getCarta(indice).getPinta() + "/" + mazo.getCarta(indice).getNumero() + ".png");
        lista.add(mazo.getCarta(indice));
        mazo.getMazo().remove(indice);
        cartas(indice);
        return true;
    }

    private void borrarLista(List lis) {
        for (int i = 0; i < lis.size(); i++) {
            System.out.println(lis.remove(i));;
        }
    }

    private void inicializarMazo(boolean mazoOrdenado) {
        indice = 102;
        mazo = new Mazo(mazoOrdenado);
        cartas(indice);
        cartasRestantes.setText(Integer.toString(mazo.getMazo().size()));
    }

    private void juegoNuevo() {
        borrarLista(lesp1);
        borrarLista(lesp2);
        borrarLista(lesp3);
        borrarLista(lesp4);
        borrarLista(lesp5);
        borrarLista(lesp6);
        borrarLista(lesp7);
        borrarLista(lesp8);

        Cambiar.fondoDeLabel(this, esp1, Imagen.FONDO_ESP1);
        Cambiar.fondoDeLabel(this, esp2, Imagen.FONDO_ESP2);
        Cambiar.fondoDeLabel(this, esp3, Imagen.FONDO_ESP3);
        Cambiar.fondoDeLabel(this, esp4, Imagen.FONDO_ESP4);
        Cambiar.fondoDeLabel(this, esp5, Imagen.FONDO_ESP5);
        Cambiar.fondoDeLabel(this, esp6, Imagen.FONDO_ESP6);
        Cambiar.fondoDeLabel(this, esp7, Imagen.FONDO_ESP7);
        Cambiar.fondoDeLabel(this, esp8, Imagen.FONDO_ESP8);
        inicializarMazo(false);
    }

    private void initAcercaDe() {
        AcercaDe ad = new AcercaDe("JSolitario", "Un juego solitario, jugado en Chile, hecho en Java", "Patricio Pérez Pinto", "2012", "Patricio Pérez Pinto", GPL.AMBAS_VERSIONES);
        ad.addComponent(this.menuItemAcercade);
    }

    private boolean isPintaInLista(List<Carta> lista, Carta c) {
        try{
            Carta carta = lista.get(0);
            if(carta != null){
                if(carta.getPinta().equalsIgnoreCase(c.getPinta())){
                    return true;
                }else return false;
            }
            else return false;
        }catch(IndexOutOfBoundsException ex){
            return false;
        }
    }

    private int getEspacioJugable(Carta carta) {
        if(lesp1.isEmpty() && carta.getNumero() == 13){
            return 1;
        }
        
        if(lesp2.isEmpty() && carta.getNumero() == 13){
            return 2;
        }
        
        if(lesp3.isEmpty() && carta.getNumero() == 13){
            return 3;
        }
        if(lesp4.isEmpty() && carta.getNumero() == 13){
            return 4;
        }
        
        if(lesp5.isEmpty() && carta.getNumero() == 1){
            return 5;
        }
        
        if(lesp6.isEmpty() && carta.getNumero() == 1){
            return 6;
        }
        
        if(lesp7.isEmpty() && carta.getNumero() == 1){
            return 7;
        }
        
        if(lesp8.isEmpty() && carta.getNumero() == 1){
            return 8;
        }
        //aca ya hay cartas en las listas
        Carta ultimaCarta;
        int numero;
        String pinta;
        
        if(!lesp1.isEmpty()){
            ultimaCarta = lesp1.get(lesp1.size()-1);//obtengo la ultima carta
            numero = ultimaCarta.getNumero();
            pinta = ultimaCarta.getPinta();
            if(pinta.equalsIgnoreCase(carta.getPinta()) && numero == carta.getNumero()+1){
                return 1;
            }
        }
        
        if(!lesp2.isEmpty()){
            ultimaCarta = lesp2.get(lesp2.size()-1);//obtengo la ultima carta
            numero = ultimaCarta.getNumero();
            pinta = ultimaCarta.getPinta();
            if(pinta.equalsIgnoreCase(carta.getPinta()) && numero == carta.getNumero()+1){
                return 2;
            }
        }
        
        
        if(!lesp3.isEmpty()){
            ultimaCarta = lesp3.get(lesp3.size()-1);//obtengo la ultima carta
            numero = ultimaCarta.getNumero();
            pinta = ultimaCarta.getPinta();
            if(pinta.equalsIgnoreCase(carta.getPinta()) && numero == carta.getNumero()+1){
                return 3;
            }
        }
        
        
        if(!lesp4.isEmpty()){
            ultimaCarta = lesp4.get(lesp4.size()-1);//obtengo la ultima carta
            numero = ultimaCarta.getNumero();
            pinta = ultimaCarta.getPinta();
            if(pinta.equalsIgnoreCase(carta.getPinta()) && numero == carta.getNumero()+1){
                return 4;
            }
        }
        
        
        if(!lesp5.isEmpty()){
            ultimaCarta = lesp5.get(lesp5.size()-1);//obtengo la ultima carta
            numero = ultimaCarta.getNumero();
            pinta = ultimaCarta.getPinta();
            if(pinta.equalsIgnoreCase(carta.getPinta()) && numero == carta.getNumero()-1){
                return 5;
            }
        }
        
        
        if(!lesp6.isEmpty()){
            ultimaCarta = lesp6.get(lesp6.size()-1);//obtengo la ultima carta
            numero = ultimaCarta.getNumero();
            pinta = ultimaCarta.getPinta();
            if(pinta.equalsIgnoreCase(carta.getPinta()) && numero == carta.getNumero()-1){
                return 6;
            }
        }
        
        
        if(!lesp7.isEmpty()){
             ultimaCarta = lesp7.get(lesp7.size()-1);//obtengo la ultima carta
            numero = ultimaCarta.getNumero();
            pinta = ultimaCarta.getPinta();
            if(pinta.equalsIgnoreCase(carta.getPinta()) && numero == carta.getNumero()-1){
                return 7;
            }
        }
       
        
        if(!lesp8.isEmpty()){
            ultimaCarta = lesp8.get(lesp8.size()-1);//obtengo la ultima carta
            numero = ultimaCarta.getNumero();
            pinta = ultimaCarta.getPinta();
            if(pinta.equalsIgnoreCase(carta.getPinta()) && numero == carta.getNumero()-1){
                return 8;
            }
        }
        
        
        return -1;
    }

    private void cabiarFondoCartaVuelta(String ruta) {
        Imagen.CARTA_VUELTA = ruta;
        Cambiar.fondoDeLabel(this, cartaVuelta, Imagen.CARTA_VUELTA);
    }
}
